www.gusucode.com > 组态王 VC++ 组态软件源码源码程序 > 组态王 VC++ 组态软件源码/组态王6.5/组态王6.5/zutai4/TTYView.cpp

    // TTYView.cpp : implementation of the CTTYView class
//

#include "stdafx.h"
#include "TTY.h"
#include "TTYDoc.h"
#include "TTYView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CTTYView

IMPLEMENT_DYNCREATE(CTTYView, CEditView)

BEGIN_MESSAGE_MAP(CTTYView, CEditView)
	//{{AFX_MSG_MAP(CTTYView)
	ON_WM_CHAR()
	ON_COMMAND(IDM_WRITE, OnWrite)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CEditView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CEditView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CEditView::OnFilePrintPreview)
	ON_MESSAGE(WM_COMMNOTIFY, OnCommNotify)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTTYView construction/destruction

CTTYView::CTTYView()
{
	// TODO: add construction code here

}

CTTYView::~CTTYView()
{
}

BOOL CTTYView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	BOOL bPreCreated = CEditView::PreCreateWindow(cs);
	cs.style &= ~(ES_AUTOHSCROLL|WS_HSCROLL);	// Enable word-wrapping

	return bPreCreated;
}

/////////////////////////////////////////////////////////////////////////////
// CTTYView drawing

void CTTYView::OnDraw(CDC* pDC)
{
	CTTYDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// CTTYView printing

BOOL CTTYView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default CEditView preparation
	return CEditView::OnPreparePrinting(pInfo);
}

void CTTYView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo)
{
	// Default CEditView begin printing.
	CEditView::OnBeginPrinting(pDC, pInfo);
}

void CTTYView::OnEndPrinting(CDC* pDC, CPrintInfo* pInfo)
{
	// Default CEditView end printing
	CEditView::OnEndPrinting(pDC, pInfo);
}

/////////////////////////////////////////////////////////////////////////////
// CTTYView diagnostics

#ifdef _DEBUG
void CTTYView::AssertValid() const
{
	CEditView::AssertValid();
}

void CTTYView::Dump(CDumpContext& dc) const
{
	CEditView::Dump(dc);
}

CTTYDoc* CTTYView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CTTYDoc)));
	return (CTTYDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CTTYView message handlers


void CTTYView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default
	CTTYDoc* pDoc=GetDocument();
	
	unsigned char c=(char)nChar;

	if(!pDoc->m_bConnected)
		return;

	pDoc->WriteComm(&c, 1);

	if(pDoc->m_bEcho) 
		CEditView::OnChar(nChar, nRepCnt, nFlags); // 本地回显
}


LRESULT CTTYView::OnCommNotify(WPARAM wParam, LPARAM lParam)
{

	unsigned char buf[MAXBLOCK/4];
	char rbuf[10];
	CString str;
	int nLength, nTextLength;
	CTTYDoc* pDoc=GetDocument();

	CEdit& edit=GetEditCtrl();

	if(!pDoc->m_bConnected || 	(wParam & EV_RXCHAR)!=EV_RXCHAR) // 是否是EV_RXCHAR事件?
	{
		SetEvent(pDoc->m_hPostMsgEvent); // 允许发送下一个WM_COMMNOTIFY消息
		return 0L;
	}

	nLength=pDoc->ReadComm(buf,1);

	if(nLength)
	{
		nTextLength=edit.GetWindowTextLength();
		edit.SetSel(nTextLength,nTextLength); //移动插入光标到正文末尾

		for(int i=0;i<nLength;i++)
		{

			switch(buf[i])
			{

			case '\r': // 回车
				if(!pDoc->m_bNewLine) 
					break;

			case '\n': // 换行
				str+="\r\n";
				break;

			case '\b': // 退格
				edit.SetSel(-1, 0);
				edit.ReplaceSel(str);
				nTextLength=edit.GetWindowTextLength();
				edit.SetSel(nTextLength-1,nTextLength);
				edit.ReplaceSel(""); //回退一个字符
				str="";
				break;

			case '\a': // 振铃 
				MessageBeep((UINT)-1);
				break;

			default : 
//				str+=buf[i];
				sprintf(rbuf," %02X ",buf[i]);
				str+=rbuf;
			}
		}
		edit.SetSel(-1, 0);
		edit.ReplaceSel(str); // 向编辑视图中插入收到的字符
	}

	SetEvent(pDoc->m_hPostMsgEvent); // 允许发送下一个WM_COMMNOTIFY消息
	return 0L;
}



void CTTYView::OnWrite() 
{
	unsigned char buf[MAXBLOCK/4];
	CTTYDoc* pDoc=GetDocument();
	buf[0]=0x7f;
	buf[1]=0x1;
	buf[2]=0xFE;
	buf[3]=0xFF;
	buf[4]=0x02;

    pDoc->WriteComm(buf,5);

}